package br.tads.poo.notas.apresentacao;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
//import java.util.Date;
import java.util.InputMismatchException;
import java.util.Scanner;

import br.tads.poo.notas.excecoes.CaracteresInsulficientesException;
import br.tads.poo.notas.excecoes.EntradaComEspacosException;
import br.tads.poo.notas.excecoes.EntradaStringVaziaException;
import br.tads.poo.notas.excecoes.PrioridadeInvalidaException;
import br.tads.poo.notas.gerencia.*;
import br.tads.poo.notas.objetos.*;

public class GerenteUI{
	private Scanner sc = new Scanner(System.in);
	private BufferedReader sca = new BufferedReader(new InputStreamReader(System.in));
	private Gerente gerente = new Gerente();
	private Caderno caderno;
	private Usuario usuario;
	private ArrayList<Caderno> cadernos;
	private ArrayList<Nota> notas;
	private String nome, senha, descricao;
	private boolean flag = false, check = false;
	private int indicador, contador, dia, mes, ano;
	private Cadastro cadastro = new Cadastro();
	private Date data = new Date();

	public void run() throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException, EntradaComEspacosException, PrioridadeInvalidaException{
		cadastro.cadastroUsers(gerente);
		
		int escolha = 4;
		do{
			menu();
			try{
				escolha = sc.nextInt();
				switch (escolha) { 	
				case 1: 
					loginUsuario(); break;
				case 2: 
					criarUsuario(); break;
				case 3: 
					excluirUsuario(); break;
				}
			}
			catch(InputMismatchException o){
				System.out.println("- Digitar opção valida.");
				sc = new Scanner(System.in);
			}
		}while(escolha != 0);
	}

	public void runUser(Usuario usuario) throws IOException, EntradaStringVaziaException, CaracteresInsulficientesException, PrioridadeInvalidaException{
		int escolha = 6;
		do{
			menuUsuario(usuario);
			try{
				escolha = sc.nextInt();
				switch (escolha) { 	
				case 1: 
					criarCaderno(usuario); break;
				case 2: 
					listarCaderno(usuario); break;
				case 3: 
					verCaderno(usuario); break;
				case 4: 
					editarCaderno(usuario); break;
				case 5: 
					excluirCaderno(usuario); break;
				}
			}
			catch(InputMismatchException o){
				System.out.println("- Digitar opção valida");
				sc = new Scanner(System.in);
			}
		}while(escolha != 0);
	}
	
	public void runUserPendencias(Usuario usuario, int pendencias) throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException, PrioridadeInvalidaException{
		int escolha = 7;
		do{
			menuUsuarioPendencias(usuario, pendencias);
			try{
				escolha = sc.nextInt();
				switch (escolha) { 	
				case 1: 
					criarCaderno(usuario); break;
				case 2: 
					listarCaderno(usuario); break;
				case 3: 
					verCaderno(usuario); break;
				case 4: 
					editarCaderno(usuario); break;
				case 5: 
					excluirCaderno(usuario); break;
				case 6: 
					avisoVencimento(usuario); break;
				}
			}
			catch(InputMismatchException o){
				System.out.println("- Digitar opção valida.");
				sc = new Scanner(System.in);
			}
		}while(escolha != 0);
	}

	public void runNote(Caderno caderno) throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException, PrioridadeInvalidaException{
		int escolha = 10;
		do{
			menuCaderno(caderno);
			try{
				escolha = sc.nextInt();
				switch (escolha) { 	
				case 1: 
					criarNota(caderno); break;
				case 2:
					verNotas(caderno); break;
				case 3:
					criarLembrete(caderno); break;
				case 4: 
					verLembretes(caderno); break;
				case 5:
					adiarLembrete(caderno); break;
				case 6:
					editarNota(caderno); break;
				case 7: 
					concluirNota(caderno); break;
				case 8: 
					alterarPrioridade(caderno); break;
				case 9: 
					excluirNota(caderno); break;
				}
			}
			catch(InputMismatchException o){
				System.out.println("- Digitar opção valida.");
				sc = new Scanner(System.in);
			}
		}while(escolha != 0);
	}

	private void criarUsuario() throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException, EntradaComEspacosException { 
		System.out.println("-----------------------------------");
		System.out.println("= Digite o login: "); 
		nome = sca.readLine();
		System.out.println("= Digite a senha: "); 
		senha = sca.readLine();
		System.out.println("-----------------------------------");
		System.out.println(gerente.criarUsuario(nome, senha));
		System.out.println("-----------------------------------\n");
	} 

	private void loginUsuario() throws IOException, EntradaStringVaziaException, CaracteresInsulficientesException, PrioridadeInvalidaException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome: "); 
		nome = sca.readLine(); 
		System.out.println("= Digite a senha: "); 
		senha = sca.readLine(); 
		System.out.println("-----------------------------------");
		usuario = gerente.logarUsuario(nome, senha); 
		if (usuario != null){
			contador = numeroPendencias(usuario);
			if(contador > 0){
				runUserPendencias(usuario, contador);
			}
			else{
				runUser(usuario);
			}
		}
		else{
			System.out.println("- Usuario não encontrado.");
		}
	}

	private void excluirUsuario() throws IOException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o login: "); 
		nome = sca.readLine(); 
		System.out.println("= Digite a senha: "); 
		senha = sca.readLine(); 
		System.out.println("-----------------------------------");
		System.out.println(gerente.excluirUsuario(nome, senha));
		System.out.println("-----------------------------------\n");
	} 

	private void criarCaderno(Usuario usuario) throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome do caderno: "); 
		nome = sca.readLine();
		System.out.println("-----------------------------------");
		System.out.println(usuario.criarCaderno(nome));
		System.out.println("-----------------------------------\n");
	} 

	private void listarCaderno(Usuario usuario) throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException { 
		System.out.println("-----------------------------------");
		cadernos = usuario.listarCadernos();
		for(int i = 0; i < cadernos.size(); i++){
			System.out.println((i+1) + " - " + cadernos.get(i).getNome());
		}
		System.out.println("-----------------------------------\n");
	} 

	private void verCaderno(Usuario usuario) throws IOException, EntradaStringVaziaException, CaracteresInsulficientesException, PrioridadeInvalidaException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome do caderno: "); 
		nome = sca.readLine();
		System.out.println("-----------------------------------\n");
		caderno = usuario.verCaderno(nome);
		if (caderno != null){
			runNote(caderno);
		}
		else{
			System.out.println("- Caderno não encontrado.");
		}
		System.out.println("-----------------------------------\n");
	} 

	private void editarCaderno(Usuario usuario) throws IOException, EntradaStringVaziaException {
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome do caderno: "); 
		nome = sca.readLine(); 
		System.out.print("= Digite novo nome: "); 
		senha = sca.readLine(); 
		System.out.println("-----------------------------------");
		System.out.println(usuario.editarCaderno(nome, senha));
		System.out.println("-----------------------------------\n");
	}

	private void excluirCaderno(Usuario usuario) throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome do caderno: "); 
		nome = sca.readLine(); 
		System.out.println("-----------------------------------");
		System.out.println(usuario.excluirCaderno(nome));
		System.out.println("-----------------------------------\n");
	}

	private void criarNota(Caderno caderno) throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException, PrioridadeInvalidaException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o titulo da nota: "); 
		nome = sca.readLine();
		System.out.println("= Digite sua descricao: "); 
		senha = sca.readLine(); 
		System.out.println("= Prioridade(1 - Normal, 2 - Urgente): ");
		indicador = sc.nextInt();
		System.out.println("-----------------------------------");
		System.out.println(caderno.criarNota(nome, senha, indicador)); 
		System.out.println("-----------------------------------\n");
	}

	private void criarLembrete(Caderno caderno) throws IOException, CaracteresInsulficientesException, EntradaStringVaziaException, PrioridadeInvalidaException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o titulo do lembrete: "); 
		nome = sca.readLine();
		System.out.println("= Digite sua descricao: "); 
		senha = sca.readLine(); 
		System.out.println("= Prioridade(1 - Normal, 2 - Urgente): ");
		indicador = sc.nextInt();
		System.out.println("= Digite a data de vencimento: "); 
		System.out.println("= Dia: "); 
		dia = sc.nextInt();
		System.out.println("= Mes: ");
		mes = sc.nextInt();
		System.out.println("= Ano: "); 
		ano = sc.nextInt();
		System.out.println("-----------------------------------");
		System.out.println(caderno.criarLembrete(nome, senha, indicador, dia, mes, ano)); 
		System.out.println("-----------------------------------\n");
	}

	private void verNotas(Caderno caderno) throws IOException { 
		notas = caderno.verNotas();
		System.out.println("-----------------------------------");
		int aux = 1;

		for(int i = 0; i < notas.size(); i++){
			if(notas.get(i) instanceof Nota && notas.get(i) instanceof Lembrete == false){  
				System.out.println("------------------------");
				System.out.println("Nota n°" + aux);
				System.out.println("- Titulo: " + notas.get(i).getTitulo());
				System.out.println("- Descricao: " + notas.get(i).getDescricao());
				System.out.println("- Prioridade: " + notas.get(i).getPrioridade());
				System.out.println("- Status: " + notas.get(i).getStatus());
				System.out.println("------------------------");
				aux++;
			}
		}
		System.out.println("-----------------------------------\n");
	}

	private void verLembretes(Caderno caderno) throws IOException { 
		notas = caderno.verNotas();
		System.out.println("-----------------------------------");
		int aux = 1;

		for(int i = 0; i < notas.size(); i++){
			if(notas.get(i) instanceof Lembrete){ 
				Lembrete lembrete = (Lembrete) notas.get(i);
				System.out.println("------------------------");
				System.out.println("Lembrete n°" + aux);
				System.out.println("- Titulo: " + notas.get(i).getTitulo());
				System.out.println("- Descricao: " + notas.get(i).getDescricao());
				System.out.println("- Prioridade: " + notas.get(i).getPrioridade());
				System.out.println("- Status: " + notas.get(i).getStatus());
				System.out.println("- Data de vencimento: " + lembrete.getDataString());
				System.out.println("------------------------");
				aux++;
			}
		}
		System.out.println("-----------------------------------\n");
	}

	private void editarNota(Caderno caderno) throws IOException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome da nota/lembrete: "); 
		nome = sca.readLine(); 
		System.out.print("= Digite novo nome: "); 
		senha = sca.readLine();
		System.out.print("= Digite novo texto: "); 
		descricao = sca.readLine();
		System.out.println("-----------------------------------");
		flag = check(senha);
		check = check(descricao);

		if(flag == true && check == true){
			System.out.println(caderno.editarNotaNome(nome, senha));
			System.out.println(caderno.editarNotaDescricao(senha, descricao));
		}
		else if(flag == true){
			System.out.println(caderno.editarNotaNome(nome, senha));
		}
		else if(check == true){
			System.out.println(caderno.editarNotaDescricao(nome, descricao));
		}
		System.out.println("-----------------------------------\n");
	}

	private void concluirNota(Caderno caderno) throws IOException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome da nota ou lembrete: "); 
		nome = sca.readLine(); 
		System.out.println("-----------------------------------");
		System.out.println(caderno.editarStatus(nome, 2));
		System.out.println("-----------------------------------\n");
	}
	
	private void alterarPrioridade(Caderno caderno) throws IOException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome da nota ou lembrete: "); 
		nome = sca.readLine(); 
		System.out.println("-----------------------------------");
		System.out.println(caderno.editarPrioridade(nome, 2));
		System.out.println("-----------------------------------\n");
	}
	
	private void adiarLembrete(Caderno caderno) throws IOException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o nome do lembrete: "); 
		nome = sca.readLine();
		System.out.print("= Digite a quantidade de dias: ");
		dia = sc.nextInt();
		System.out.println("-----------------------------------");
		System.out.println(caderno.adiarLembrete(nome, dia));
		System.out.println("-----------------------------------\n");
	}

	private void excluirNota(Caderno caderno) throws IOException { 
		System.out.println("-----------------------------------");
		System.out.print("= Digite o titulo da nota ou lembrete: "); 
		nome = sca.readLine(); 
		System.out.println("-----------------------------------");
		System.out.println(caderno.excluirNota(nome));
		System.out.println("-----------------------------------\n");
	}

	public boolean check(String nome){
		if(nome.equals("")){
			return false;
		}
		return true;
	}

	public boolean check(String nome, String senha){
		if(nome.equals("") || senha.equals("")){
			return false;
		}
		return true;
	}

	@SuppressWarnings("deprecation")
	public int numeroPendencias(Usuario usuario) throws IOException{
		data = new Date();
		int contador = 0;
		cadernos = usuario.listarCadernos();
		for(int i = 0; i < cadernos.size(); i++){
			notas = cadernos.get(i).verNotas();
			for(int n = 0; n < notas.size(); n++){
				if(notas.get(n) instanceof Lembrete){ 
					Lembrete lembrete = (Lembrete) notas.get(n);
					if(data.after(lembrete.getData()) && data.getDay() != lembrete.getData().getDay()){
						contador++;
					}
				}
			}
		}
		return contador;
	}
	
	@SuppressWarnings("deprecation")
	public void avisoVencimento(Usuario usuario) throws IOException, EntradaStringVaziaException{
		data = new Date();
		cadernos = usuario.listarCadernos();
		for(int i = 0; i < cadernos.size(); i++){
			System.out.println("========================");
			System.out.println("Caderno: " + cadernos.get(i).getNome());
			System.out.println("------------------------");

			notas = cadernos.get(i).verNotas();
			for(int n = 0; n < notas.size(); n++){
				if(notas.get(n) instanceof Lembrete){ 
					Lembrete lembrete = (Lembrete) notas.get(n);
					if(data.after(lembrete.getData()) && data.getDay() != lembrete.getData().getDay()){
						System.out.println("------------------------");
						System.out.println("Nota n°" + (i+1));
						System.out.println("- Titulo: " + notas.get(i).getTitulo());
						System.out.println("- Descricao: " + notas.get(i).getDescricao());
						System.out.println("- Prioridade: " + notas.get(i).getPrioridade());
						System.out.println("- Status: " + notas.get(i).getStatus());
						System.out.println("- Data de vencimento: " + lembrete.getDataString());
						System.out.println("------------------------");
					}
				}
			}
			System.out.println("========================");
		}
	}

	public static void menu(){
		System.out.println("==========================");
		System.out.println("-       Bem - vindo      -");
		System.out.println("--------------------------");
		System.out.println("1 - Login");
		System.out.println("2 - Criar conta");
		System.out.println("3 - Excluir conta");
		System.out.println("==========================\n");
	}

	public static void menuUsuario(Usuario usuario){
		System.out.println("================================");
		System.out.println("-  Olá, " +usuario.getNome());
		System.out.println("--------------------------------");
		System.out.println("1 - Criar caderno");
		System.out.println("2 - Ver cadernos criados");
		System.out.println("3 - Ver/editar notas");
		System.out.println("4 - Alterar nome do caderno");
		System.out.println("5 - Excluir caderno");
		System.out.println("0 - Sair");		
		System.out.println("================================\n");
	}

	public static void menuUsuarioPendencias(Usuario usuario, int lembretesPendentes){
		System.out.println("================================");
		System.out.println("-  Olá, " +usuario.getNome());
		System.out.println("--------------------------------");
		System.out.println("Você possui " + lembretesPendentes + " lembretes pendentes.");
		System.out.println("--------------------------------");
		System.out.println("1 - Criar caderno");
		System.out.println("2 - Ver cadernos criados");
		System.out.println("3 - Ver/editar notas");
		System.out.println("4 - Alterar nome do caderno");
		System.out.println("5 - Excluir caderno");
		System.out.println("6 - Ver pendencias");
		System.out.println("0 - Sair");		
		System.out.println("================================\n");
	}

	public static void menuCaderno(Caderno caderno) throws EntradaStringVaziaException{
		System.out.println("======================================");
		System.out.println("-  Caderno " +caderno.getNome());
		System.out.println("--------------------------------------");
		System.out.println("1 - Criar nota ");
		System.out.println("2 - Ver notas criadas");
		System.out.println("--------------------------------------");
		System.out.println("3 - Criar lembrete");
		System.out.println("4 - Ver lembretes criados");
		System.out.println("5 - Adiar lembrete");
		System.out.println("--------------------------------------");
		System.out.println("6 - Editar conteúdo de nota/lembrete");
		System.out.println("7 - Concluir nota/lembrete");
		System.out.println("8 - Alterar prioridade nota/lembrete");
		System.out.println("9 - Excluir nota/lembrete");
		System.out.println("0 - Sair");
		System.out.println("======================================\n");
	}
}